package clientConnexion;
//******************************************************************************
// ServeurEcouteur.java
// E.Lefran�ois 10 f�vrier 2001
// Projet "Chat"
//******************************************************************************
import java.io.*;
//import java.awt.*;
//import java.net.*;
import java.util.LinkedList;
import java.util.StringTokenizer;


import sheepmixView.client.model.*;
import sheepmixView.server.PlayingCommandImpl;

//==============================================================================
// Classe "ServeurEcouteur"
// Activit� concurrente dont le r�le consiste � �couter toutes les informations
// envoy�es par le serveur.
// La connexion avec le serveur est contr�l�e de mani�re permanente.  En cas de
// probl�me, cette activit� affiche un message d'avertissement et stoppe son
// ex�cution.
//==============================================================================
public class ServeurEcouteur extends Thread {
	// Variables d'instance


	/**
	 * @supplierRole canalDentree 
	 */
	private ObjectInputStream canalDentree; // Canal d'entr�e avec le serveur

	private LinkedList<String>  genreDisponibles;
	private LinkedList<Musique> playlistActuelle;
	private Musique 			musiqueActuelle;
	
	boolean genreAJour    = false;
	boolean musiqueAJour  = false;
	boolean playlistAJour = false;
	boolean enTransition  = false;
	
	
	public boolean estEntransition() {
		return enTransition;
	}
	
	public void setEnTransition(boolean b) {
		enTransition = b;
	}
	
	public boolean isGenreAJour() {
		return genreAJour;
	}
	
	public boolean isMusiqueAJour() {
		return musiqueAJour;
	}
	
	public boolean isPlaylistAJour() {
		return playlistAJour;
	}
	
	public LinkedList<String> getGenre() {
		return genreDisponibles;
	}
	
	public LinkedList<Musique> getPlaylist() {
		return playlistActuelle;
	}
	
	public Musique getMusique() {
		return musiqueActuelle;
	}
	
	public void setPlaylistAJour(boolean b) {
		playlistAJour = b;
	}
	
	public void setGenreAJour(boolean b) {
		genreAJour = b;
	}
	
	public void setMusiqueAJour(boolean b) {
		musiqueAJour = b;
	}

	/**
	 * @supplierRole a_gui 
	 */
	//private InterfaceUtilisateur a_gui;  // Interface utilisateur (boutons,
	// zones d'affichage)


	/**
	 * @supplierRole a_client 
	 */
	private Client a_client;            // client associ�

	// Constructeur(s)
	public ServeurEcouteur (InputStream is, Client client) {
		a_client = client;
		//a_gui = gui;

		try {
			canalDentree = new ObjectInputStream (is);
			this.start();		// Pour d�marrer l'activit� concurrente
		}
		catch (Exception e) {
			//a_gui.afficherAvertissement ("!! PROBLEME DE CONNEXION !!",
			//e.toString());
			System.out.println("Probleme de connexion");
		}
	}


	// Code de l'activit� concurrente
	@SuppressWarnings("unchecked")
	public void run () {
		String message = "";
		String ligneRecue;
		Object recep;
		try {
			while (true) {
				System.out.println("Test");
				try {
					recep = canalDentree.readObject();
					System.out.println("objet recu : "+recep);
					
					if(recep instanceof LinkedList<?>) {
						if(!((LinkedList<?>) recep).isEmpty()) {
							if(((LinkedList<?>) recep).getFirst() instanceof String) {
								//a_gui.afficherDansZoneChat("LL", recep.toString());
								genreDisponibles = ((LinkedList<String>)recep);
								genreAJour = true;
								
							}
							else
							{	
								PlayingCommandImpl.playlist = ((LinkedList<Musique>) recep);
								PlayingCommandImpl.updatePlaylist = true;
							}
						}
					}
					else if(recep instanceof Musique) {
						PlayingCommandImpl.playedMusic = (Musique)recep;
						PlayingCommandImpl.updateMusique = true;

					}
					else {
						ligneRecue = (String)recep;
						if (ligneRecue == null) {   // Connexion interrompue
							message = "Terminaison normale";    // par le serveur
							break;        // ("null"signale la fin d'un stream)
						}
						analyserLigneRecue(ligneRecue);
					}
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}         
			}
		}

		catch (IOException e) { message = e.toString(); }
		finally {
			a_client.ev_connexionFermee (message);
		}
	}

	private void analyserLigneRecue(String ligne) {
		StringTokenizer st = new StringTokenizer (ligne, "#");
		try {
			String typeInfo = st.nextToken();
			if (typeInfo.equals("CTR")){
				String info = st.nextToken();
				if (info.equals("LOGIN_OK")) a_client.ev_sessionAcceptee();
				else if (info.equals("LOGIN_ERROR"))
					a_client.ev_sessionRefusee(" !! SESSION REFUSEE !! " +
							st.nextToken());
				else if (info.equals("CONNEXION_FERMEE"))
					a_client.ev_connexionFermee("FIN SESSION " + st.nextToken());
				else if (info.equals("TRANS OK"))
					setEnTransition(false);
//				else if (info.equals("SET_CHANGE")) {
//					a_client.ev_getPlayedMusic();
//					a_client.ev_getPlaylist();
//				}

				else signalerErreur(ligne);
			}
			else if (typeInfo.equals("DATA")){
				String idSource = st.nextToken();
				//a_gui.afficherDansZoneChat  (idSource, st.nextToken());
				System.out.println(idSource + " -- " + st.nextToken());
			}
			else signalerErreur(ligne);
		}
		catch (Exception e) {signalerErreur(ligne);}
	}

	private void signalerErreur (String ligneRecue) {
		//a_gui.afficherAvertissement
		//(" !! INFORMATION RECUE ERRONEE !! ", ligneRecue);
		System.out.println("Information recue erronee : " + ligneRecue);
	}

}



